package com.supermarket.config;

import com.supermarket.config.interceptor.JwtAuthInterceptor;
import com.supermarket.config.interceptor.LoginInterceptor;
import com.supermarket.config.interceptor.RequestLogInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.nio.file.Paths;

/**
 * Web MVC 配置
 */
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Value("${file.upload.path:uploads}")
    private String uploadPath;

    @Autowired
    private RequestLogInterceptor requestLogInterceptor;
    
    @Bean
    public JwtAuthInterceptor jwtAuthInterceptor() {
        return new JwtAuthInterceptor();
    }
    
    /**
     * 配置静态资源映射
     * 将上传目录映射为可通过HTTP访问的路径
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        // 获取上传目录的绝对路径
        String absolutePath = Paths.get(uploadPath).toFile().getAbsolutePath();
        
        // 添加资源处理器，将/uploads/**的请求映射到文件系统中的实际位置
        registry.addResourceHandler("/uploads/**")
                .addResourceLocations("file:" + absolutePath + "/");

        // 添加资源处理器，将/static/**的请求映射到文件系统中的实际位置
        registry.addResourceHandler("/static/**")
                .addResourceLocations("classpath:/static/", "file:" + absolutePath + "/");
                
        // 打印静态资源映射信息，便于调试
        System.out.println("\n======== 静态资源映射配置 ========");
        System.out.println("上传目录路径: " + absolutePath);
        System.out.println("/uploads/** 映射到: file:" + absolutePath + "/");
        System.out.println("/static/** 映射到: classpath:/static/ 和 file:" + absolutePath + "/");
        System.out.println("==================================\n");
    }
    
    /**
     * 添加拦截器配置
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 获取上传目录的绝对路径
        String absolutePath = Paths.get(uploadPath).toFile().getAbsolutePath();
        
        // 请求日志拦截器（拦截所有请求）
        registry.addInterceptor(requestLogInterceptor)
                .addPathPatterns("/**");
        
        // 打印JWT拦截器配置信息
        System.out.println("\n======== JWT拦截器配置 ========");
        System.out.println("拦截路径: /address/**, /cart/**, /order/**, /favorites/**");
        System.out.println("排除路径: /login, /register, /logout, /stats, /order/stats/**, ...");
        System.out.println("特别排除: /category.json, /commodities/**, /article/**, 静态资源");
        System.out.println("================================\n");
        
        // JWT认证拦截器
        registry.addInterceptor(jwtAuthInterceptor())
                // 需要拦截的路径
                .addPathPatterns("/address/**", "/cart/**", "/order/**", "/favorites/**")
                // 不需要拦截的路径
                .excludePathPatterns(
                    "/login", 
                    "/register", 
                    "/logout", 
                    "/stats",             // 系统统计数据
                    "/order/stats/**",    // 订单统计数据
                    "/static/**", 
                    "/uploads/**",
                    "/commodities/**",     // 排除所有商品相关API
                    "/article/**",         // 排除文章相关API
                    "/article-media/**",   // 排除文章媒体相关API
                    "/article-like/**",    // 排除文章点赞相关API
                    "/article-comment/**", // 排除文章评论相关API
                    "/user/alluser/**",    // 用户列表查询
                    "/user/selectByID",    // 根据ID查询用户
                    "/category.json",      // 明确排除category.json
                    "/**/*.json",          // 排除所有JSON文件
                    "/**/*.js",            // 排除所有JS文件
                    "/**/*.css",           // 排除所有CSS文件
                    "/**/*.html",          // 排除所有HTML文件
                    "/**/*.ico",           // 排除所有图标文件
                    "/**/*.png",           // 排除所有PNG图片
                    "/**/*.jpg",           // 排除所有JPG图片
                    "/**/*.gif",           // 排除所有GIF图片
                    "/**/*.svg",           // 排除所有SVG图片
                    "/**/*.ttf",           // 排除所有字体文件
                    "/**/*.woff",          // 排除所有WOFF字体文件
                    "/**/*.woff2",         // 排除所有WOFF2字体文件
                    "/**/*.eot"            // 排除所有EOT字体文件
                );
        
        // 会话登录拦截器（用于不使用JWT的场景，如管理后台）
        registry.addInterceptor(new LoginInterceptor())
                // 需要拦截的路径
                .addPathPatterns("/admin/**")
                // 不需要拦截的路径
                .excludePathPatterns(
                    "/login", 
                    "/register", 
                    "/static/**", 
                    "/uploads/**");
    }
} 